﻿/*
* Copyright (c) 2008 michiyasu wada
* http://www.seyself.com/
* 
* Distributed under The MIT License.
* [http://www.opensource.org/licenses/mit-license.php]
*/

import com.seyself.utils.StringUtil;
import com.seyself.utils.ObjectUtil;

class com.seyself.utils.ArrayUtil
{
    
    /**
    * 
    * @param    obj
    * @return
    */
    public static function parse( obj:Array ):String
    {
        if( arguments.length <= 1 ){
            var lev = 0;
        } else {
            var lev = arguments[1]+1;
        }
        var str = StringUtil.pow("    ", lev )+ "[\n";
        for(var i=0;i<obj.length;i++){
            if( typeof obj[i] == "object" ){
                if( obj[i] instanceof Array ){
                    str += parse( obj[i] , lev );
                }
                else {
                    str += ObjectUtil.parse( obj[i] , lev );
                }
            } else {
                if( typeof obj[i] == "string" ){
                    str += StringUtil.pow("    ", lev )+"\""+ obj[i]+"\" ,\n";
                } else {
                    str += StringUtil.pow("    ", lev )+ obj[i]+" ,\n";
                }
            }
        }
        var tmp = str.split("\n");
        tmp[tmp.length-2] = tmp[tmp.length-2].split(",").join("");
        str = tmp.join("\n");
        if( lev ){
            str += StringUtil.pow("    ", lev )+ "] ,\n";
        } else {
            str += StringUtil.pow("    ", lev )+ "] \n";
        }
        return str;
    }
    
    /**
     * 指定値の配列内でのインデックスを調べる
     * 
     * @usage   
     * @param   g - use data
     * @param   a - use numbers-group Array.
     * @return  approximate number
     */
    public static function indexOf( array:Array , param ):Number
    {
        var len:Number = array.length;
        for(var i=0;i<len;i++) if( array[i]==param ) return i;
        return -1;
    }
    
    /**
     * 配列の中から一番近い数値を返す
     * 
     * @usage   
     * @param   g - use numbers-group Array.
     * @param   n - use number
     * @return  approximate number
     */
    public static function approx( g:Array , n:Number ){
        var t = g[0];
        for(var i=1;i<g.length;i++){
            if( Math.abs(g[i]-n) < Math.abs( t-n ) ) t = g[i];
        }
        return t;
    }
    
    /**
     * 同じデータで構成された配列を作成する
     * 
     * @usage   
     * @param   param : Object - 配列にセットする値
     * @param   leng :Number - 配列の数
     * @return  Array - 新しい配列を返します
     */
    public static function identicalArray( param , len:Number ):Array
    {
        var a = [];
        for(var i=0;i<len;i++){
            a.push(param);
        }
        return a;
    }
    
    /**
     * 連続する数値で構成された配列を作成する
     * 
     * @usage   
     * @param   firstNumber : Number - 配列の最初に入る数値
     * @param   lastNumber :Number - 配列の最後に入る数値
     * @return  Array - 新しい配列を返します
     */
    public static function numericArray( firstNumber:Number , lastNumber:Number ):Array
    {
        var a = [];
        if( firstNumber<=lastNumber ){
            for(var i=firstNumber;i<=lastNumber;i++){
                a.push(i);
            }
        } else {
            for(var i=firstNumber;i>=lastNumber;i--){
                a.push(i);
            }
        }
        return a;
    }
    
    /**
    * 渡された昇順に並べられた数値の配列の内、数値が何番目に位置するかを返す
    * 
    * @param param : Number - 何番目の素数を取得するかを指定する数値
    * @return Number or Array - 指定した位置の素数、もしくは素数の配列
    * @usage <code>
    * import com.seyself.math.Math2;
    * trace( Math2.prime( 24 ) ); // 出力 : 97
    * </code>
    */
    public static function interval( n , members ):Number
    {
        var leng = members.length;
        for(var i=leng;i>0;i--){
            if(n >= members[i]){
                return (i-1);
            }
        }
        return -1;
    }
    
    /**
    * 
    * @param    array
    * @return
    */
    public static function shuffle( array:Array ):Array
    {
        var c:Array = array.concat();
        var n:Number, t, i:Number = c.length - 1;
        for( ; i; --i ){
            n = Math.random() * i >> 0;
            t = c[i];
            c[i] = c[n];
            c[n] = t;
        }
        return c;
    }
    
    /**
    * 
    * @param    array
    * @return
    */
    public static function clone( array:Array ):Array
    {
        var tmp:Array = array.concat();
        var len:Number = array.length;
        for(var i:Number=0;i<len;i++){
            if( tmp[i] instanceof Array ){
                tmp[i] = clone( tmp[i] );
            }
        }
        return tmp;
    }
    
    public static function matches( array:Array , expression:Array ):Array
    {
        var i:Number, j:Number;
        var alen:Number = array.length;
        var elen:Number = expression.length;
        var res:Array = [];
        for (i = 0; i < alen; i++ ) {
            for (j = i; j < elen; j++ ) {
                if( array[i] == elen[j] ) {
                    res.push( array[i] );
                }
            }
        }
        return res;
    }
    
}